from django.shortcuts import render
from django.http.response import HttpResponse
# Create your views here.


def index(request):

    return HttpResponse('OK')



from book.models import BookInfo
BookInfo.objects.all()

# 增加数据
# 方法一
from book.models import BookInfo
book=BookInfo()
book.name='django'
book.readcount=10
book.commentcount=100
book.pub_date='2000-2-2'
book.save()

# 方法二
new_book=BookInfo.objects.create(
    name='python',
    pub_date='2020-1-1',
    readcount=10,
    commentcount=100
)



# 更新数据
# 方法一
# 获取实例对象
book=BookInfo.objects.get(id=1)
# 通过修改实例对象的属性来修改数据
book.name='射雕英雄后后后传'
book.pub_date='2000-1-1'
# 人为的调用 实例对象的save方法
book.save()

# 方法二--直接更新
# filter()根据条件查询数据
BookInfo.objects.filter(id=1).update(
    name='射雕英雄前传',
    pub_date='2020-2-2'
)

# 删除数据
# 方法一
# 获取实例对象,通过调用delete方法实现数据的删除   !!! id所定义的数据一定要存在
book=BookInfo.objects.get(id=6)
book.delete()
# 方法二
BookInfo.objects.get(id=1).delete()
BookInfo.objects.filter(id=7).delete()

# 查询------基本查询
# get查询单一结果,如果不存在会抛出 模型类.DoesNotExist异常
# 捕获异常
try:
    BookInfo.objects.get(id=1)
except BookInfo.DoesNotExist as e:
    print(e)
BookInfo.objects.get(name='雪山飞狐')

BookInfo.objects.all()

# count查询结果数量
BookInfo.objects.all().count()

###### 过滤查询
# filter过滤出多个结果 返回的是列表
BookInfo.objects.filter(name__contains='飞')
BookInfo.objects.filter(id__exact=2)
# get()查询出来是一个对象 如果查询的对象不存在会抛出异常
BookInfo.objects.get(id__exact=2)
#查询编号为2的图书
BookInfo.objects.get(id__exact=2)
book=BookInfo.objects.get(id=2)
print(book)
list=BookInfo.objects.filter(id=2)
print(list)
# 查询书名包含'湖'的图书
BookInfo.objects.filter(name__contains='湖')
# 查询书名以'湖'结尾的图书
BookInfo.objects.filter(name__endswith='湖')
# 查询书名为空的图书
BookInfo.objects.filter(name__isnull=True)
# BookInfo.objects.filter(name__isnull=False)
# 查询编号为1和2和3的图书
BookInfo.objects.filter(id__in=[1,2,3])
# 查询编号大于3的图书
# gt 大于 great 大
# gte 大于等于 e equel 等于
# lt 小于 litte
# lte
BookInfo.objects.filter(id__gt=3)
# 查询1986年发表的图书
BookInfo.objects.filter(pub_date__year=1986)
# 查询1990年1月1日后发表的图书
BookInfo.objects.filter(pub_date__gt='1990-1-1')
# 查询编号不等于3的图书
# exclude排除掉符合条件剩下的结果
BookInfo.objects.exclude(id=3)


# 查询 F对象
# 两个属性比较
# 查询阅读量大于等于评论量的图书
from django.db.models import F
BookInfo.objects.filter(readcount__gte=F('commentcount'))

# 查询 Q对象
# 多条件查询
# & 并且的意思
# | 或者的意思
# 查询标号大于2 并且 阅读量大于20的图书
from django.db.models import Q
BookInfo.objects.filter(Q(id__gt=2) & Q(readcount__gt=20))
BookInfo.objects.filter(Q(id__gt=2) | Q(readcount=20))
# 不用Q写法
BookInfo.objects.filter(id__gt=2).filter(readcount__gt=20)
BookInfo.objects.filter(id__gt=2,readcount__gt=20)

# ~操作符,表示非
BookInfo.objects.filter(~Q(id=3))



#### 查询 聚合函数
# 使用aggregate()过滤器调用聚合函数
from django.db.models import Sum
BookInfo.objects.aggregate(Sum('readcount'))

#### 查询 排序
# 使用order_by对结果进行排序
# 默认是升序
BookInfo.objects.all().order_by('readcount')
# 降序
BookInfo.objects.all().order_by('-readcount')

#### 查询--关联查询
# 查询书籍为2的所有人物信息
from book.models import PeopleInfo
PeopleInfo.objects.filter(book_id=2)
# 根据书籍查询人物
# 1. 把书籍查询出来
book=BookInfo.objects.get(id=2)
print(book)
# 2. 把人物查询出来
book.peopleinfo_set.all()


#### 查询 关联过滤查询
# 由多模型累条件查询-模型类数据
# 查询图书 要求图书中人物的描述包含'八'  最终结果是 图书  查询条件是 人物
BookInfo.objects.filter(peopleinfo__description__contains='八')
BookInfo.objects.filter(peopleinfo__name='东方不败')

#### 由一模型累条件查询多模型类数据
# 查询图示阅读量大于30的所有人物
PeopleInfo.objects.filter(book__readcount__gt=30)
# 查询书名为'条龙八部'的所有人物
PeopleInfo.objects.filter(book__name='天龙八部')


####查询集QuerySet

# 惰性执行 使用的时候才会执行 不适用不会执行
book=BookInfo.objects.all()
book
# 缓存 通过一个变量来接受查询数据 能够缓存数据
books=BookInfo.objects.all()
[book.id for book in books]

#### 限制查询集  对查询结果集进行切片的操作
BookInfo.objects.all()[0:2]
BookInfo.objects.all()[2]


#### 分页
# 导入分页类
from django.core.paginator import Paginator
# 组织列表数据
books=BookInfo.objects.all()
# 创建分页对象
# object_list,  列表
# per_page      每页多少条数据

p = Paginator(books,per_page=2)
# 获取第几页数据
page_objects=p.page(1)
# 总共多少页
p.num_pages
# 要分页的数据
page_objects.object_list



